#ifndef P4_H
#define P4_H
#include <iostream>
#include <vector>
#include <fstream>
#include <stdlib.h>
#include <sstream>
#include <iterator>
#include <algorithm>

#define ITER 100000
/*
#ifdef __amd64
inline uint64_t rdtsc(){
	uint32_t lo, hi;
	__asm__ __volatile__ (
	"xorl %%eax, %%eax\n"
	"cpuid\n"
	"rdtsc\n"
	: "=a" (lo), "=d" (hi)
	:
	: "%ebx", "%ecx" );
	return (uint64_t)hi << 32 | lo;
}
#endif
*/

using namespace std;



struct ficha{
	int id;
	int rotacion;
	int base;
	int altura;
	vector<vector<int> > puntos; // vector de enteros 0 y 1
	int cantNegras;
};


struct posiciones{
	int id; //numero
	int r; // rotacion
	int x; // posicion en x sup izquierda
	int y; //posicion en y sup izquierda
	ficha fic;

};



struct tablero{
	int base;
	int altura;
	vector<vector<int> > colores; // indica las posiciones que se van completando, marcadas por un 2
	vector<vector<int> > usadas; //las fichas ya colocadas
	int cantLibres; // indica las posiciones libres
	int cantNegras; // indica la cantidad de negras libres
};




//ostream& operator<<(ostream& os, const posiciones& p);
template<class T>ostream& operator<<(ostream& os, const vector<T>& v);
vector<posiciones > resolver(ficha& tablero,int& k, vector<ficha >& fichero);
void salida(ostream& out, vector<posiciones >& sol);
bool resolver(tablero& tab,int& k,  vector<ficha >& fichero,vector<posiciones> & pos );
bool backtrack(tablero& tab , int& k , vector<ficha >& fichero,vector<posiciones>& pos, int& x , int& y );
void rotar(ficha& fi);
int probar(tablero& tab,const ficha& fi, int& x, int& y);
void actualizar(tablero& tab,vector<posiciones>& pos,int& x,int& y);
void desactualizar(tablero& tab,vector<posiciones>& pos,int& x,int& y);

#endif // P1_H
